/**
 * 给定数组A，再给定一个正整数K，
 * 每一次拿走一个Ai，放进y和z，满足 y + z == Ai + K
 * 问最少几次操作使得数组中元素全部相等，不能则输出-1
 * 首先考虑-1的情况，如果Ai小于K，则yz中必然有小于K的数
 * 如果Ai大于K，则yz中必然存在大于K的数
 * 因此可行条件是Ai全小于K，或者全等于K，或者全大于K，其余则是-1
 * 首先考虑全大于的K的情况，假设最后的目标是k+d
 * 则 Ai + k = (k + d) + (Ai - d)
 * k + d 显然不会再操作，于是相当于用 Ai-d 代替了 Ai
 * 拿 Ai - d 继续操作，得到 Ai - nd = k + d
 * 即 d 必须是 Ai - k 的约数。
 * 因此 d 必须是 gcd(Ai - k)
 * 小于k的情况类似
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

#include <bits/stdc++.h>
using namespace std;

#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

int N;
llt K;
vector<llt> A;

llt procD(){ 
    llt g = A[0] - K;
    for(int i=1;i<N;++i) g = __gcd(g, A[i] - K);
    llt ans = 0;
    for(auto i : A){
        ans += (i - K - g) / g;
    }
    return ans;
}

llt procX(){
    llt g = K - A[0];
    for(int i=1;i<N;++i) g = __gcd(g, K - A[i]);
    llt ans = 0;
    for(auto i : A){
        ans += (K - g - i) / g;
    }
    return ans;
}

llt proc(){
    if(1 == N) return 0;
    sort(A.begin(), A.end());
    if(A[0] == K and A[N - 1] == K) return 0;
    if(A[0] > K) return procD();
    if(A[N - 1] < K) return procX();
    return -1;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> K;
        A.assign(N, {});
        for(auto & i : A) cin >> i;
        cout << proc() << "\n";
    }
    return 0;
}